package MODEL;

import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import oracle.jdbc.OracleTypes;

/**
 * Classe de mapeamento da entidade banda
 */
public class BandaModel extends AbstractModel {
    private String                          nome;
    private String                          historia;
    private String                          site;
    private String                          local;
    private LineUpModel                     lineUp;
    private Integer                         ordemApresentacao;
    private ArrayList<IntegranteBandaModel> integrantes;
    private CallableStatement               chamada;
    private ResultSet                       resultado;    

    public BandaModel() {
        
    }
    
    public BandaModel(
            String nome,
            String historia,
            String site,
            String local,
            LineUpModel lineUp,
            Integer ordemApresentacao) {
        this.nome = nome;
        this.historia = historia;
        this.site = site;
        this.local = local;
        this.lineUp = lineUp;
        this.ordemApresentacao = ordemApresentacao;
    }
    
    public String getNome() {
        return nome;
    }

    public void setNome(String nome) {
        this.nome = nome;
    }

    public String getHistoria() {
        return historia;
    }

    public void setHistoria(String historia) {
        this.historia = historia;
    }

    public String getSite() {
        return site;
    }

    public void setSite(String site) {
        this.site = site;
    }

    public String getLocal() {
        return local;
    }

    public void setLocal(String local) {
        this.local = local;
    }

    public LineUpModel getLineUp() {
        return lineUp;
    }

    public void setLineUp(LineUpModel lineUp) {
        this.lineUp = lineUp;
    }

    public Integer getOrdemApresentacao() {
        return ordemApresentacao;
    }

    public void setOrdemApresentacao(Integer ordemApresentacao) {
        this.ordemApresentacao = ordemApresentacao;
    }

    public ArrayList<IntegranteBandaModel> getIntegrantes() {
        return integrantes;
    }
    
    /**
     * Método busca de integrantes no banco de dados
     * 
     * @param conexao
     * @return rrayList<IntegranteBandaModel> integrantes
     * @throws java.sql.SQLException
     */    
    public ArrayList<IntegranteBandaModel> getIntegrantesDB(Connection conexao) throws SQLException {
        try {
            chamada = conexao.prepareCall("call F_GET_INTEGRANTES(?,?)");
            chamada.setString(1, nome);
            chamada.registerOutParameter(2, OracleTypes.CURSOR);
            chamada.execute();
            resultado = (ResultSet) chamada.getObject(2);
        } catch (SQLException e) {
            //System.out.println(e.getMessage());
        }        

        integrantes = new ArrayList<>();
        while (resultado.next()) {
            integrantes.add(new IntegranteBandaModel(
                this,
                resultado.getString("funcao"),
                    dataSQLtoCalendar(resultado.getDate("data_inicio")),
                resultado.getString("historia")
            ));
        }

        return integrantes;
    }
    
    public void setIntegrantes(ArrayList<IntegranteBandaModel> integrantes) {
        this.integrantes = integrantes;
    } 
}
